程式解題競賽的迷人之處是什麼?我的回答是,享受那個絞盡腦汁以後想出答案的瞬間。英文的話是 "the a-ha moment"。在那個瞬間,你腦海中的資料結構和演算法結合起來,並且向你傳達了『這題可以解』的訊息。再經過數秒鐘,你會感受到時間複雜度的分析,以及題目設計者留下的可能陷阱。當然,很多時候這些想法不見得能讓你真的通過評測拿到 AC (Accepted)。這時候那個心中『我看透了』的雀躍感就會變成『我看涼透了』的一絲傷感。
資奧系列的比賽通常都是個人賽,一道題目如果想不出來,是很有可能整場比賽都做不出來的。近年來的選手圈會把這樣的慘況描述成『燒機』。這時候時間的分配與答題的取捨會變成訓練上的一個重要的項目。團體賽的設立,讓燒機慘況的頻率大幅降低。以現狀來說,目前國內與國際上,大家推崇的團體賽制是遵循『國際大學生程式設計競賽』(International Collegiate Programming Contest, ICPC) 的賽制而設定的。該賽制有有兩大特色。其一是『三人一機』,每個隊伍雖然能夠有三個人,但是在比賽期間只有一台電腦(只有一台螢幕、一部鍵盤與一支滑鼠)可用。這會讓解題與除錯的時間分配顯得非常重要。另一個特色是解題送氣球,解出題目越多的隊伍,工作人員就會到你的位置上綁越多的氣球。
在台灣,對高中生來說最重要的一個團體賽制的程式解題競賽,想必就是每年在台灣大學舉辦的『網際網路程式設計全國大賽』NPSC 了。
NPSC 有分初賽與決賽。每一所學校至多只能有兩支隊伍晉級決賽。以高中組來說,每一隊伍至少要有二至三人,決賽的比賽時長為 5 小時,題數通常有 8 至 9 題。比賽的系統也有與時俱進。近幾年採用了與 ICPC 世界決賽相同的 Kattis 比賽系統,是個相當穩定且具有公信力的比賽。每一年拉到的贊助獎項也不少,通常前六名會有不錯的獎品,尤其是第一名的隊伍,通常每個同學會得到一台還不錯的筆電作為獎勵。印象非常非常深刻的是其中有幾年送給第二名的隊員們高級檜木西洋棋盤,據說市價不斐,但同學們反倒更羨慕更後面名次的隊伍們...。
筆者有幸能在 2006 年取得第一名的成績。當年裁判之一的蜜蜂學長,在我們最後六分鐘破台的時候,說了一句讓我印象超級深刻的一句話『只要開個記憶體把算過的東西存下來之後用得到就是動態規劃 (DP)。所以 BFS 是一種 DP,DFS 其實也是一種 DP。』這句話其實深遠地影響了我對動態規劃的看法,也讓我在之後的求學之路中特別留意了更多關於動態規劃的酷炫題目。大家有興趣的話可以參考我在數年前鐵人賽撰寫的動態規劃百題之經典、理論與實作。
除此之外,NPSC 也是台灣少數有開放國中組參加的程式解題競賽。國中組題目的難度相較於高中組來說,相對有比較簡單,但對國中生來說仍然非常有挑戰性。往年表現亮眼的國中生選手們,也大多會在高中時在資訊能力競賽中發光發熱。不過,好像全台灣的國中老師們不見得知道這項比賽。筆者當年國中時只知道查資料比賽可以摸到電腦,不知道有 NPSC 可以參加。
今天分享一道今年度 IZhO 的題目。給你一個長度為 N 的整數序列,所有數字都在 1 到 10^9 之間。若一個非邊界數字恰好是他左右兩個數字的平均,那麼你可以刪除它並將兩邊接起來。請問經過若干次操作後,該序列最少能剩下多少個數字?